package com.weimob.cloud.api.crm.req;

import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.io.Serializable;
import java.util.List;

/**
 * 微盟调整余额请求参数
 */
@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class WeimobCrmBalanceAdjustReq implements Serializable {

    /**
     * 该笔余额操作的请求流水号，用于操作幂等。可自定义输入，与 requestType 搭配使用，需保证全局唯一。
     */
    @JsonProperty("requestId")
    private String requestId;

    /**
     * 请求类型
     * 枚举值
     * 0-其他；
     * 1-微商城订单请求；
     * 2-提现申请单请求；
     * 3-预充订单请求；
     * 4-预充调整订单请求；
     * 5-开放平台请求；
     * 6-智慧酒店订单请求；
     * 7-智慧旅游订单请求；
     * 8-发券宝活动请求；
     * 9-老旺铺迁移订单；
     * 10-到店请求；
     * 11-公共营销请求；
     * 12-营销活动奖品服务请求；
     * 13-签到有礼服务请求；
     * 14-解绑微信会员卡请求；
     * 15-删除会员请求；
     * 16-智营销请求；
     * 17-智营销流程自动化插件；
     * 18-会员营销发奖服务请求；
     * 19-知识付费；
     * 20-智慧美业；
     * 21-OneCrm；
     * 22-售后退还；
     * 23-交易中台扣减
     */
    @JsonProperty("requestType")
    private Integer requestType;

    /**
     * 调整对象信息
     */
    @JsonProperty("adjustAmountInfoList")
    private List<AdjustAmountInfoListDTO> adjustAmountInfoList;

    /**
     * 调整类型
     * 枚举值
     * 1-调增；2-调减
     */
    @JsonProperty("adjustType")
    private Integer adjustType;

    @JsonProperty("changeReason")
    private String changeReason;

    /**
     * 当前操作人 wid
     * 获取方法
     * 可以通过 bos/employee/getList 接口返回参数中的 data.wid 获取该 wid。也可以直接传默认值 0。
     */
    @JsonProperty("operatorWid")
    private Long operatorWid;

    /**
     * 变更本金数值（单位：元），和 changeGrantsAmount 字段（变更赠金）两选一必填。当 adjustType=1（即调整类型为调增）时，最高上限 5000，最多支持两位小数。
     */
    @JsonProperty("changCapitalAmount")
    private String changCapitalAmount;

    /**
     * 变更赠金（单位：元），和 changCapitalAmount 字段（变更本金）两选一必填最多支持两位小数。
     */
    @JsonProperty("changeGrantsAmount")
    private String changeGrantsAmount;

    @JsonProperty("operateStoreVid")
    private Long operateStoreVid;
    @JsonProperty("sourceVid")
    private Long sourceVid;
    @JsonProperty("settleRule")
    private List<SettleRuleDTO> settleRule;
    @JsonProperty("changeType")
    private String changeType;
    @JsonProperty("outTransNo")
    private String outTransNo;
    @JsonProperty("outTransType")
    private String outTransType;

    @Data
    @NoArgsConstructor
    @AllArgsConstructor
    @Builder
    public static class AdjustAmountInfoListDTO implements Serializable {

        @JsonProperty("vid")
        private Long vid;

        /**
         * 待调整余额的目标客户编号
         */
        @JsonProperty("wid")
        private Long wid;

        @JsonProperty("balancePlanId")
        private Long balancePlanId;
    }

    @Data
    @NoArgsConstructor
    @AllArgsConstructor
    @Builder
    public static class SettleRuleDTO implements Serializable {

        @JsonProperty("vid")
        private Long vid;
        @JsonProperty("rate")
        private Double rate;
    }
}
